package com.example.d6_homework.homework07;

import java.io.*;
import java.text.DecimalFormat;

public class Test {
    private static final DecimalFormat df = new DecimalFormat("##%");

    public static void main(String[] args) {
        // 创建源文件夹对象
        File srcDir = new File("D:\\File\\java");
        // 创建目标文件夹对象
        File destDir = new File("D:\\File\\temp1");

        try {
            // 调用方法拷贝文件夹到文件夹
            copyDirToDir(srcDir, destDir);
            System.out.println("复制完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 复制文件夹到文件夹
     *
     * @param srcDir  源文件夹
     * @param destDir 目标文件夹
     */
    public static void copyDirToDir(File srcDir, File destDir) throws IOException {
        // 1.获取源文件夹中所有一级文件对象
        File[] files = srcDir.listFiles();
        if (files == null) {
            return;
        }

        // 2.遍历一级文件对象
        for (File file : files) {
            // 判断是否是文件
            if (file.isFile()) {
                // 拷贝文件并显示进度
                copyFileWithProgress(file, destDir);
            } else {
                File newDestDir = new File(destDir, file.getName());
                if (!newDestDir.exists()) {
                    newDestDir.mkdirs();
                }
                // 递归创建文件夹
                copyDirToDir(file, newDestDir);
            }
        }
    }

    /**
     * 复制文件到文件夹,并显示文件复制进度
     *
     * @param srcFile 源文件
     * @param destDir 目标文件夹
     */
    public static void copyFileWithProgress(File srcFile, File destDir) throws IOException {
        // 创建目标文件
        File destFile = new File(destDir, srcFile.getName());

        // 获取源文件的大小
        long fileSize = srcFile.length();
        // 存储已经复制的文件大小
        long copiedSize = 0;

        try (
                InputStream is = new FileInputStream(srcFile);
                OutputStream os = new FileOutputStream(destFile)
        ) {

            byte[] buffer = new byte[1024]; // 使用较大的缓冲区提高效率
            int len;
            while ((len = is.read(buffer)) != -1) {
                // 写入到目标文件
                os.write(buffer, 0, len);
                // 更新已复制的大小
                copiedSize += len;

                // 更新并打印进度
                double progress = ((double) copiedSize / fileSize);
                String format = df.format(progress);
                System.out.print("\r复制 " + srcFile.getName() + ": " + format); // \r 用于在同一行刷新输出
            }
        }
        System.out.println(); // 移动到下一行
    }
}